<!DOCTYPE html>
<html  lang="zh-CN" >
    <head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, minimum-scale=1, initial-scale=1, maximum-scale=5, viewport-fit=cover">
    <title>STM32学习笔记-CortexM3的函数跳转 | LO_StacNet的火柴盒</title>
    <meta name="description" content="STM32学习笔记-CortexM3的函数跳转STM32F1是CortexM3内核，这里记录一下其函数跳转与中断跳转中的寄存器与堆栈变换情况。">
<meta property="og:type" content="article">
<meta property="og:title" content="STM32学习笔记-CortexM3的函数跳转">
<meta property="og:url" content="https://lostacnet.top/post/3814/">
<meta property="og:site_name" content="LO_StacNet的火柴盒">
<meta property="og:description" content="STM32学习笔记-CortexM3的函数跳转STM32F1是CortexM3内核，这里记录一下其函数跳转与中断跳转中的寄存器与堆栈变换情况。">
<meta property="og:locale" content="zh_CN">
<meta property="og:image" content="https://s21.ax1x.com/2024/08/03/pkjhpOU.png">
<meta property="og:image" content="https://s21.ax1x.com/2024/08/03/pkjhCmF.png">
<meta property="og:image" content="https://s21.ax1x.com/2024/08/03/pkjhPw4.png">
<meta property="article:published_time" content="2024-03-08T12:14:09.000Z">
<meta property="article:modified_time" content="2024-08-03T14:04:20.447Z">
<meta property="article:author" content="LO_StacNet">
<meta property="article:tag" content="中断">
<meta property="article:tag" content="堆栈">
<meta property="article:tag" content="STM32">
<meta name="twitter:card" content="summary">
<meta name="twitter:image" content="https://s21.ax1x.com/2024/08/03/pkjhpOU.png">

    
    <link rel="icon" href="/images/favicon.ico" type="image/x-icon">

    
<link rel="stylesheet" href="/css/common.min.css">



    
        <link href="//cdn.jsdelivr.net/npm/katex@0.9.0/dist/katex.min.css" rel="stylesheet">
    
    
    
    
        <link href="//cdn.jsdelivr.net/npm/lightgallery.js@1.1.3/dist/css/lightgallery.min.css" rel="stylesheet">
    
    
    
<link rel="stylesheet" href="/css/iconfont.min.css">

    
<meta name="generator" content="Hexo 6.3.0"><style>mjx-container[jax="SVG"] {
  direction: ltr;
}

mjx-container[jax="SVG"] > svg {
  overflow: visible;
}

mjx-container[jax="SVG"][display="true"] {
  display: block;
  text-align: center;
  margin: 1em 0;
}

mjx-container[jax="SVG"][justify="left"] {
  text-align: left;
}

mjx-container[jax="SVG"][justify="right"] {
  text-align: right;
}

g[data-mml-node="merror"] > g {
  fill: red;
  stroke: red;
}

g[data-mml-node="merror"] > rect[data-background] {
  fill: yellow;
  stroke: none;
}

g[data-mml-node="mtable"] > line[data-line] {
  stroke-width: 70px;
  fill: none;
}

g[data-mml-node="mtable"] > rect[data-frame] {
  stroke-width: 70px;
  fill: none;
}

g[data-mml-node="mtable"] > .mjx-dashed {
  stroke-dasharray: 140;
}

g[data-mml-node="mtable"] > .mjx-dotted {
  stroke-linecap: round;
  stroke-dasharray: 0,140;
}

g[data-mml-node="mtable"] > svg {
  overflow: visible;
}

[jax="SVG"] mjx-tool {
  display: inline-block;
  position: relative;
  width: 0;
  height: 0;
}

[jax="SVG"] mjx-tool > mjx-tip {
  position: absolute;
  top: 0;
  left: 0;
}

mjx-tool > mjx-tip {
  display: inline-block;
  padding: .2em;
  border: 1px solid #888;
  font-size: 70%;
  background-color: #F8F8F8;
  color: black;
  box-shadow: 2px 2px 5px #AAAAAA;
}

g[data-mml-node="maction"][data-toggle] {
  cursor: pointer;
}

mjx-status {
  display: block;
  position: fixed;
  left: 1em;
  bottom: 1em;
  min-width: 25%;
  padding: .2em .4em;
  border: 1px solid #888;
  font-size: 90%;
  background-color: #F8F8F8;
  color: black;
}

foreignObject[data-mjx-xml] {
  font-family: initial;
  line-height: normal;
  overflow: visible;
}

.MathJax path {
  stroke-width: 3;
}

mjx-container[display="true"] {
  overflow: auto hidden;
}

mjx-container[display="true"] + br {
  display: none;
}
</style></head>

    <body>
        <header class="header header-fixture">
    <div class="profile-search-wrap flex sm:block">
        
        
        <div class="profile sm:text-center md:px-1 lg:px-3 sm:pb-4 sm:pt-6">
            <a id="avatar" role="link" href="http://www.lostacnet.top" class="inline-block lg:w-16 lg:h-16 w-8 h-8 m-2" target="_blank" rel="noopener" rel="noreferrer" >
                <img src="/images/avatar.jpg" class="rounded-full" alt="avatar">
            </a>
            <h2 id="name" class="hidden lg:block">LO_StacNet</h2>
            <h3 id="title" class="hidden lg:block">电子玩家 &amp; 理想主义</h3>
            
            <small id="location" class="hidden lg:block">
                <i class="iconfont icon-map-icon"></i>
                Sichuan, China
            </small>
            
        </div>
        
        
<div class="search flex-1 flex lg:inline-block sm:hidden lg:px-4 lg:mt-2 lg:mb-4 lg:w-full">
    <form id="search-form" class="my-auto flex-1 lg:border lg:border-solid lg:border-gray-200">
        <div class="input-group table bg-gray-100 lg:bg-white w-full">
            <input id="search-input" type="text" placeholder="搜索" class="inline-block w-full bg-gray-100 lg:bg-white p-1">
            <span class="table-cell">
                <button name="search tigger button" disabled>
                    <i class="iconfont icon-search m-2"></i>
                </button>
            </span>
        </div>
    </form>
        
<div id="content-json" data-placeholder="搜索" class="invisible hidden">/content.json</div>
<script id="search-teamplate" type="text/html" data-path="/content.json">
    <div>
        <div class="search-header bg-gray-400">
            <input id="actual-search-input" model="keyword" ref="input" class="inline-block w-full h-10 px-2 py-1" placeholder="搜索" type="text">
        </div>
        <div class="search-result bg-gray-200">
            {{#each searchPosts}}
            <a href="/{{ path }}" class="result-item block px-2 pb-3 mb-1 pt-1 hover:bg-indigo-100">
                <i class="iconfont icon-file"></i>
                <h1 class="result-title inline font-medium text-lg">{{ title }}</h1>
                <p class="result-content text-gray-600 text-sm">{{{ text }}}</p>
            </a>
            {{/each}}
        </div>
    </div>
</script>

</div>


        <button name="menu toogle button" id="menu-toggle-btn" class="block sm:hidden p-3" role="button" aria-expanded="false">
            <i class="iconfont icon-hamburger"></i>
        </button>
    </div>
    <nav id="menu-nav" class="hidden sm:flex flex-col">
        
        
            <div class="menu-item menu-home" role="menuitem">
                <a href="/.">
                    <i class="iconfont icon-home" aria-hidden="true"></i>
                    <span class="menu-title">首页</span>
                </a>
            </div>
        
        
            <div class="menu-item menu-archives" role="menuitem">
                <a href="/archives">
                    <i class="iconfont icon-archive" aria-hidden="true"></i>
                    <span class="menu-title">归档</span>
                </a>
            </div>
        
        
            <div class="menu-item menu-categories" role="menuitem">
                <a href="/categories">
                    <i class="iconfont icon-folder" aria-hidden="true"></i>
                    <span class="menu-title">分类</span>
                </a>
            </div>
        
        
            <div class="menu-item menu-tags" role="menuitem">
                <a href="/tags">
                    <i class="iconfont icon-tag" aria-hidden="true"></i>
                    <span class="menu-title">标签</span>
                </a>
            </div>
        
        
            <div class="menu-item menu-links" role="menuitem">
                <a href="/links">
                    <i class="iconfont icon-friend" aria-hidden="true"></i>
                    <span class="menu-title">友链</span>
                </a>
            </div>
        
        
            <div class="menu-item menu-about" role="menuitem">
                <a href="/about">
                    <i class="iconfont icon-cup" aria-hidden="true"></i>
                    <span class="menu-title">关于</span>
                </a>
            </div>
        
        
<div class="social-links flex sm:flex-col lg:hidden mt-5">
    
        <span class="social-item text-center">
            <a target="_blank" rel="noopener" href="https://github.com/LOStacNet">
                <i class="iconfont social-icon icon-github"></i>
                <span class="menu-title hidden lg:inline">menu.github</span>
            </a>
        </span>
    
        <span class="social-item text-center">
            <a target="_blank" rel="noopener" href="https://gitee.com/LOStacNet">
                <i class="iconfont social-icon icon-project"></i>
                <span class="menu-title hidden lg:inline">menu.project</span>
            </a>
        </span>
    
</div>


    </nav>
</header>

        <section class="main-section">
            
    <main class="flex-1 px-4 py-14 md:px-5 lg:px-8 lg:py-4 relative min-h-screen">
    

    <article class="content article article-archives article-type-list" itemscope="">
        <header class="article-header">
            
    
        <h1 class="article-title text-lg" itemprop="name">
            STM32学习笔记-CortexM3的函数跳转
        </h1>
    



            <p class="article-meta mb-3 text-xs">
                <span class="article-date">
    <i class="iconfont icon-calendar-check"></i>
	<a href="/post/3814/" class="article-date">
	  <time datetime="2024-03-08T12:14:09.000Z" itemprop="datePublished">3月 8</time>
	</a>
</span>

                
    <span class="article-category">
    <i class="iconfont icon-folder"></i>
    <a class="article-category-link" href="/categories/STM32%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/">STM32学习笔记</a>
  </span>


                
    <span class="article-tags">
    <i class="iconfont icon-tag"></i>
    <a class="article-tag-none-link" href="/tags/STM32/" rel="tag">STM32</a>, <a class="article-tag-none-link" href="/tags/%E4%B8%AD%E6%96%AD/" rel="tag">中断</a>, <a class="article-tag-none-link" href="/tags/%E5%A0%86%E6%A0%88/" rel="tag">堆栈</a>
  </span>


                <span class="_partial/post-comment"><i class="icon icon-comment"></i>
                    <a href="/post/3814/#comments" class="article-comment-link">
                        评论
                    </a>
                </span>
                
    
        <span class="post-wordcount" itemprop="wordCount">字数统计: 2.1k(字)</span>
    
    
        <span class="post-readcount" itemprop="timeRequired">阅读时长: 7(分)</span>
    


            </p>
        </header>
        <div class="marked-body article-body">
            <h1 id="STM32学习笔记-CortexM3的函数跳转"><a href="#STM32学习笔记-CortexM3的函数跳转" class="headerlink" title="STM32学习笔记-CortexM3的函数跳转"></a>STM32学习笔记-CortexM3的函数跳转</h1><p>STM32F1是CortexM3内核，这里记录一下其函数跳转与中断跳转中的寄存器与堆栈变换情况。</p>
<span id="more"></span>

<h2 id="CortexM3的寄存器和堆栈"><a href="#CortexM3的寄存器和堆栈" class="headerlink" title="CortexM3的寄存器和堆栈"></a>CortexM3的寄存器和堆栈</h2><p>首先，得知道M3各个寄存器。</p>
<p><img src="https://s21.ax1x.com/2024/08/03/pkjhpOU.png" alt="image-20240308203057070"></p>
<p>这里主要需要关注R13栈堆寄存器(保存堆栈地址)，R14连接寄存器(储存跳转前地址)，R15程序计数寄存器(指向下一条要执行的指令地址)。</p>
<p>除此之外还有一些特殊功能寄存器。只能被MSR、MRS指令访问。</p>
<p><img src="https://s21.ax1x.com/2024/08/03/pkjhCmF.png" alt="image-20240308203247182"></p>
<p>这里只需要关注xPSR寄存器(储存程序状态)，CONTROL寄存器（主要是其控制堆栈指针的功能）。</p>
<h3 id="SP栈指针"><a href="#SP栈指针" class="headerlink" title="SP栈指针"></a>SP栈指针</h3><p>SP指针指向的是栈的地址，最开始指向栈底，使用压栈出栈指令的时候会自动进行管理地址的增减。栈堆一个很重要的作用就是在跳转中<strong>储存寄存器的值</strong>。</p>
<blockquote>
<p>堆栈的 PUSH 与 POP </p>
<p>堆栈是一种存储器的使用模型。它由一块连续的内存和一个栈顶指针组成，用于实 现“后进先出”的缓冲区。其最典型的应用，就是在数据处理前先保存寄存器的值，再 在处理任务完成后从中恢复先前保护的这些值。</p>
<p><img src="https://s21.ax1x.com/2024/08/03/pkjhPw4.png" alt="image-20240308205855773"></p>
<p>在执行 PUSH 和 POP 操作时，那个通常被称为 SP 的地址寄存器，会由硬件自动调整它的值，以避免后续操作破坏先前的数据。</p>
</blockquote>
<p>栈寄存器分为**MSP(主栈)和PSP(线程栈)**，由CONTROL寄存器决定。系统复位后或处于处理模式时为MSP。MSP初地址在向量表的第一项。同一时间SP只能读到一个栈，但可以通过MRS/MSR 指令来指名道姓地访问具体的堆栈指针。</p>
<h3 id="LR链接寄存器"><a href="#LR链接寄存器" class="headerlink" title="LR链接寄存器"></a>LR链接寄存器</h3><p>LR寄存器在使用跳转指令<code>BL</code>,<code>BLX</code>时，内核会将返回地址保存在LR中，方便之后直接使用<code>BX LR</code>返回。如果发生函数嵌套，需要在跳转前将BL的值压入栈，防止再次被覆盖。</p>
<p>在发生中断跳转到中断处理函数时，LR寄存器会储存一个叫<code>EXC_RETURN</code>的值，用来进行中断跳转流程。</p>
<h3 id="PC寄存器"><a href="#PC寄存器" class="headerlink" title="PC寄存器"></a>PC寄存器</h3><p>这个不用多说，储存了下一条要执行指令的地址，程序往下运行的核心（也是程序跑飞的核心）。CortexM3只支持Thumb模式运行，因此其最低位必须为1，表示在Thumb模式，否则会产生一个fault异常。</p>
<h3 id="xPSR寄存器"><a href="#xPSR寄存器" class="headerlink" title="xPSR寄存器"></a>xPSR寄存器</h3><p>程序状态寄存器，三合一，主要保存了一些状态（比如计算溢出、进位之类）。</p>
<h3 id="CONTROL寄存器"><a href="#CONTROL寄存器" class="headerlink" title="CONTROL寄存器"></a>CONTROL寄存器</h3><p>用来设定是使用MSP还是PSP以及设定是程序是特权级(可以访问全部地址和功能)还是用户级(受限的地址和寄存器访问)。</p>
<h2 id="APCS标准"><a href="#APCS标准" class="headerlink" title="APCS标准"></a>APCS标准</h2><p>ARM公司给ARM框架上的程序都规定了一套标准，所有编译器的编译结果都必须按照这个标准，这样编译出来的程序才能进行正确链接。APCS定义了以下几个方面：</p>
<ul>
<li>对寄存器使用的限制。</li>
<li>使用栈的惯例。</li>
<li>在函数调用之间传递/返回参数。</li>
<li>可以被‘回溯’的基于栈的结构的格式，用来提供从失败点到程序入口的函数(和给予的参数)的列表。</li>
</ul>
<p>这里给出它的几个要点：</p>
<ol>
<li><p>参数和返回值传递，对于简单的情况，输入参数由R0-R3分别用来记录第1到第4个参数。当传递的参数超过4个时，就需要借助栈来保存参数。函数的返回值通常保存在R0中，若返回值为64位的，R1也用来保存返回值。</p>
</li>
<li><p>函数调用中的寄存器用法。函数或子程序应该<strong>保持R4-R11、R13(SP)和R14(LR)<strong>的数值。若这些寄存器在函数或子程序执行期间被修改，则其函数应该保持在栈中并在返回调用代码前</strong>恢复</strong>。这几个寄存器也被称作“被调用者保存寄存器”，也就是需要被调用者（例如子函数，中断等）进行保存的寄存器。而对于<strong>R0-R3、R12、则属于调用者保存寄存器</strong>，这几个寄存器是需要调用者做保存工作。<strong>在发生异常或中断啊时，R0-R3、R12、SP、PC会硬件自动进程压栈。</strong></p>
</li>
<li><p>链接寄存器<strong>LR用于函数或子程序调用时返回地址的保存</strong>，若某函数需要调用另外一个函数或子程序，则它需要首先将LR的数值保存到栈中，否则，当执行了函数调用后，LR的当前值就会丢失。</p>
</li>
</ol>
<p>总结一下，就是参数值传递按顺序存放在寄存器r0,r1,r2,r3里，超过4个参数值传递则放栈里。返回值放在r0,r1中。然后就是R4-R11、R13(SP)和R14(LR)的数值不能被改变。</p>
<h2 id="函数跳转过程"><a href="#函数跳转过程" class="headerlink" title="函数跳转过程"></a>函数跳转过程</h2><p>函数的跳转不涉及特权模式，其过程还是比较简单的（相对于中断处理来说）。</p>
<p>在<a target="_blank" rel="noopener" href="https://blog.csdn.net/weixin_52288941/article/details/120676938">这篇文章</a>给出了一个具体的例子。</p>
<ol>
<li><p>当程序需要进行函数跳转时，会<strong>将函数的参数放到R0,R1,R2,R3寄存器(<strong>一共4*32位)，如果需要更大空间，需要</strong>将参数压到栈</strong>中。如果这其中还有有用的数据，需要先将其也压入栈中（比如中断嵌套时，这其中还有要使用的参数）。</p>
</li>
<li><p>之后执行跳转指令，该指令会跳转到一个地址并将跳转前的地址存到LR寄存器中。</p>
</li>
<li><p>进行跳转后，子函数<strong>需要保存R4-R11、R14(LR)的值到栈中</strong>(如果不改动就不需要保存)。</p>
</li>
<li><p>执行子程序，将要<strong>返回的结果存放在R0、R1</strong>。</p>
</li>
<li><p>执行完成跳转回去前，将保存的寄存器值<strong>恢复</strong>出来。</p>
</li>
<li><p>利用LR的值进行跳转指令，回到原程序。</p>
</li>
</ol>
<h2 id="中断的跳转流程"><a href="#中断的跳转流程" class="headerlink" title="中断的跳转流程"></a>中断的跳转流程</h2><p>中断的跳转与函数跳转不同，中断会直接打断程序的运行，不会等程序准备好跳转（此时R0-R3等寄存器还没有准备好，可能存有重要数据）。另外，中断使用的栈是MSP和程序可能使用PSP，栈的位置不同，会涉及到栈地址的保存。</p>
<p>因此对于中断，有一个专门中断跳转流程。</p>
<h3 id="1，入栈"><a href="#1，入栈" class="headerlink" title="1，入栈"></a>1，入栈</h3><p>触发中断后，处理器要做的第一件事是<strong>保存现场</strong>。不像函数调用，此时无法保证APCS标准中的寄存器做好了跳转准备，因此处理器会依次把<strong>xPSR, PC, LR, R12以及R3-R0</strong>由硬件自动压入适当的堆栈中。如果此时正在使用PSP则压入PSP，否则压入MSP。<strong>进入中断后使用MSP</strong>。</p>
<h3 id="2，取向量"><a href="#2，取向量" class="headerlink" title="2，取向量"></a>2，取向量</h3><p>函数跳转指令需要地址，中断也需要。中断的地址储存在中断向量表中。在数据总线入栈时，指令总线（I-Code）会从向量表中读取中断处理函数的地址。</p>
<h3 id="3，更新寄存器"><a href="#3，更新寄存器" class="headerlink" title="3，更新寄存器"></a>3，更新寄存器</h3><p>完成上述操作后，处理器会将SP变成MSP，同时在IPSR相应位置设置异常编号，将地址放进PC，更新LR值。</p>
<p>此时，填入LR寄存器的值是一个特殊的名为<code>EXC_RETURN</code>的值，该值标志了中断返回后使用线程模式还是处理模式，使用PSP还是MSP。同时还标志了栈帧类型（结束后会设置到CONTROL寄存器的FPCA位）。</p>
<h3 id="4，进入中断"><a href="#4，进入中断" class="headerlink" title="4，进入中断"></a>4，进入中断</h3><p>进入中断函数后，和其他函数一样，软件去保存其他寄存器。之后执行自己的服务。结束后软件恢复保存的栈。</p>
<h3 id="5，中断返回"><a href="#5，中断返回" class="headerlink" title="5，中断返回"></a>5，中断返回</h3><p>在中断函数中执行触发中断返回的指令（<code>BX LR</code>,<code>POP</code>,<code>LDR</code>,<code>LDM</code>）改变PC的值为EXC_RETURN，会触发异常返回。 </p>
<p>根据EXC_RETURN确定返回后处理器的状态。之后进行出栈，恢复之前被硬件压栈的寄存器。</p>
<blockquote>
<p>引入一个EXC_RETURN的作用：使编译器能够以编译普通函数的方式编译中断函数，而不必使用标识进行注明（比如51中的__interrupt）。</p>
</blockquote>
<h2 id="参考文章"><a href="#参考文章" class="headerlink" title="参考文章"></a>参考文章</h2><p>CM3权威指南</p>
<p><a target="_blank" rel="noopener" href="https://blog.csdn.net/itismine/article/details/4752489">APCS，ARM 过程调用标准(ARM Procedure Call Standard) </a></p>

        </div>
        
<blockquote class="copyright">
    <p><strong>本文链接 : </strong><a class="permalink" href="https://lostacnet.top/post/3814/">https://lostacnet.top/post/3814/</a></p>
    <p><strong>This article is available under <a href="https://creativecommons.org/licenses/by-nc-sa/4.0/" target="_blank" rel="noopener noreferrer">Attribution-NonCommercial-ShareAlike 4.0 International (CC BY-NC-SA 4.0)</a> License  转载请注明出处</strong></p>
</blockquote>


    </article>
    
    <section id="comments">
        
    </section>


    

</main>


<aside style="" id="sidebar" class="aside aside-fixture">
    <div class="toc-sidebar">
        <nav id="toc" class="article-toc">
            <h3 class="toc-title">文章目录</h3>
            <ol class="toc"><li class="toc-item toc-level-1"><a class="toc-link" href="#STM32%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0-CortexM3%E7%9A%84%E5%87%BD%E6%95%B0%E8%B7%B3%E8%BD%AC"><span class="toc-number">1.</span> <span class="toc-text">STM32学习笔记-CortexM3的函数跳转</span></a><ol class="toc-child"><li class="toc-item toc-level-2"><a class="toc-link" href="#CortexM3%E7%9A%84%E5%AF%84%E5%AD%98%E5%99%A8%E5%92%8C%E5%A0%86%E6%A0%88"><span class="toc-number">1.1.</span> <span class="toc-text">CortexM3的寄存器和堆栈</span></a><ol class="toc-child"><li class="toc-item toc-level-3"><a class="toc-link" href="#SP%E6%A0%88%E6%8C%87%E9%92%88"><span class="toc-number">1.1.1.</span> <span class="toc-text">SP栈指针</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#LR%E9%93%BE%E6%8E%A5%E5%AF%84%E5%AD%98%E5%99%A8"><span class="toc-number">1.1.2.</span> <span class="toc-text">LR链接寄存器</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#PC%E5%AF%84%E5%AD%98%E5%99%A8"><span class="toc-number">1.1.3.</span> <span class="toc-text">PC寄存器</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#xPSR%E5%AF%84%E5%AD%98%E5%99%A8"><span class="toc-number">1.1.4.</span> <span class="toc-text">xPSR寄存器</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#CONTROL%E5%AF%84%E5%AD%98%E5%99%A8"><span class="toc-number">1.1.5.</span> <span class="toc-text">CONTROL寄存器</span></a></li></ol></li><li class="toc-item toc-level-2"><a class="toc-link" href="#APCS%E6%A0%87%E5%87%86"><span class="toc-number">1.2.</span> <span class="toc-text">APCS标准</span></a></li><li class="toc-item toc-level-2"><a class="toc-link" href="#%E5%87%BD%E6%95%B0%E8%B7%B3%E8%BD%AC%E8%BF%87%E7%A8%8B"><span class="toc-number">1.3.</span> <span class="toc-text">函数跳转过程</span></a></li><li class="toc-item toc-level-2"><a class="toc-link" href="#%E4%B8%AD%E6%96%AD%E7%9A%84%E8%B7%B3%E8%BD%AC%E6%B5%81%E7%A8%8B"><span class="toc-number">1.4.</span> <span class="toc-text">中断的跳转流程</span></a><ol class="toc-child"><li class="toc-item toc-level-3"><a class="toc-link" href="#1%EF%BC%8C%E5%85%A5%E6%A0%88"><span class="toc-number">1.4.1.</span> <span class="toc-text">1，入栈</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#2%EF%BC%8C%E5%8F%96%E5%90%91%E9%87%8F"><span class="toc-number">1.4.2.</span> <span class="toc-text">2，取向量</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#3%EF%BC%8C%E6%9B%B4%E6%96%B0%E5%AF%84%E5%AD%98%E5%99%A8"><span class="toc-number">1.4.3.</span> <span class="toc-text">3，更新寄存器</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#4%EF%BC%8C%E8%BF%9B%E5%85%A5%E4%B8%AD%E6%96%AD"><span class="toc-number">1.4.4.</span> <span class="toc-text">4，进入中断</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#5%EF%BC%8C%E4%B8%AD%E6%96%AD%E8%BF%94%E5%9B%9E"><span class="toc-number">1.4.5.</span> <span class="toc-text">5，中断返回</span></a></li></ol></li><li class="toc-item toc-level-2"><a class="toc-link" href="#%E5%8F%82%E8%80%83%E6%96%87%E7%AB%A0"><span class="toc-number">1.5.</span> <span class="toc-text">参考文章</span></a></li></ol></li></ol>
        </nav>
    </div>
</aside>





        </section>
        <footer class="hidden lg:block fixed bottom-0 left-0 sm:w-1/12 lg:w-1/6 bg-gray-100 z-40">
    
    <div class="footer-social-links">
        
            <a target="_blank" rel="noopener" href="https://github.com/LOStacNet">
                <i class="iconfont icon-github"></i>
            </a>
        
            <a target="_blank" rel="noopener" href="https://gitee.com/LOStacNet">
                <i class="iconfont icon-project"></i>
            </a>
        
    </div>
    
    
</footer>

        <div id="mask" class="hidden mask fixed inset-0 bg-gray-900 opacity-75 z-40"></div>
        <div id="search-view-container" class="hidden shadow-xl"></div>
        
<script src="/js/dom-event.min.js"></script>



<script src="/js/local-search.min.js"></script>



    <script src="//cdn.jsdelivr.net/npm/lightgallery.js@1.1.3/dist/js/lightgallery.min.js"></script>
    
<script src="/js/light-gallery.min.js"></script>






    </body>
</html>
